# @Time : 2024/10/23 22:14
# @Author : Fioman 
# @Phone : 13149920693
"""
re 模块的一般使用步骤:
1) re.compile(r"\d+") 先将正则表达式编译成一个Pattern对象
2) 使用pattern对象的一些方法进行正则查找,比如match,search,findAll,查找成功返回一个Match对象
3) 使用match对象的group方法可以获取到匹配到子串,然后里面的start和end方法可以获取到其索引位置
    还有span()方法获取其索引区间 前闭后开,不包括end
"""
import re

# region 1. match(string,[,pos[,endpos]]) 从头开始匹配,如果未指定pos的话,endpos不包括
pattern = re.compile(r"\d+")  # 用于匹配至少一个数字,全部必须是数字不能是字符串
text = "one12twothree34four"
m = pattern.match(text)
# 查找头部,没有匹配,所以返回None
print(m)
# 从索引为2的位置开始匹配,匹配到索引为5的位置
m = pattern.match(text, 2, 5)
print(m)
# 从索引为3的位置,匹配到索引为6的位置(12t) #
m = pattern.match(text, 3, 6)
print(m)
if m is not None:
    finded = m.group()
    print(finded)  # 返回的是12
    startIndex = m.start(0)
    endIndex = m.end(0)
    span = m.span(0)  # 元组,获取到的结果的起始位置和结束位置,包含start,不包含end,对应于start和end
    print(startIndex, endIndex, span, type(span))
# endregion

# region 2. group(index) 返回一个或者多个匹配的字符串,当要获取整个匹配的子串的时候,使用group()或者
# group(0)
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)  # 匹配至少一个a-z的字符串,匹配两个
s = "Fioman Study At Night"
m = pattern.match(s)
if m is not None:
    g = m.group(0)
    g1 = m.group(1)
    g2 = m.group(2)
    print(g, g1, g2)
    print(m.span(0), m.span(1), m.span(2))
    print(m.groups())  # 等价与 m.groups() => (m.group(1),m.group(2),...)
# endregion

# region 3. search(string[,pos[,endpos]]) 用于查找字符串的任何位置,一次匹配找到之后就返回
# pos  和 endpos 是起始位置和结束为止,默认是0 和  len(字符串长度)
pattern = re.compile(r"\d+")  # 用于匹配至少一个数字,全部必须是数字不能是字符串
text = "one12twothree34four"
m = pattern.search(text)
print(m.group())
m = pattern.search(text, 10, 30)
print(m.group())

# 再看一个例子
pattern = re.compile(r"\d+")  # 至少匹配一个数字,必须全部是数字,不包含空格
text = "hello12345678 910 11"
m = pattern.search(text)
if m:
    print(m.group())
    print(m.span(0))
# 使用match匹配不上
m = pattern.match(text)
if not m:
    print("没有符合match匹配的子字符串")
# endregion

# region 4. findall(string [,pos[,endpos]]) 返回所有的匹配结果
# 以列表形式返回所有的的能匹配的子串,如果没有匹配结果,则返回一个空列表
pattern = re.compile(r"\d+")
text1 = "one12twothree34four"
text2 = "hello12345678 910 11"
res1 = pattern.findall(text1)
res2 = pattern.findall(text2)
print(res1, res2)

# 如果是分组呢
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)
text = "Fioman Study At Night Just SSSSS ABC"
res = pattern.findall(text)
print(res, type(res[0]))  # [('Fioman', 'Study'), ('At', 'Night'), ('Just', 'SSSSS')]

# endregion
